package com.kfm.base.oop;

public class Constructor {

    {
        a = 5;
        System.out.println("{} 1");
    }

    {
        a = 4;
        System.out.println("{}");
    }

//    static int a = 1;
    int a = 1;
    public Constructor(int a){
        // 局部变量和成员变量名相同时，优先使用局部变量.
        // 遮蔽(shadowing) 局部名 a 遮蔽了成员变量 a
//        Constructor.a = a;
        /*
            this 我，当前对象（谁在调用这个方法，this就是谁）

         */
        this.a = a;
        System.out.println("Constructor(int b)");
    }

    public Constructor(){
        System.out.println("无参构造");
    }

    static {
        System.out.println("static{}");
    }


    public static void main(String[] args) {

        /*
          构造方法(函数)是一个特殊的方法。创建对象(实例化)对象时调用, 可用来初始化类(实例成员)

          [修饰符] 类名([参数列表]){
             // 方法体
          }

          我们之前的 Student 类、Cat 类、 Person 类都没有写构造，但是我们可以直接 new 来创建对象。为什么？
          Java 会为我们每个 没有写构造（显示声明）的类,添加一个 无参构造:
            public 类名(){}

          初始化的顺序：
           第一次使用时，先加载类。进行静态初始化
           每次实例化时先执行实例初始化 再执行构造
         */

//        Constructor c = new Constructor();
//        System.out.println(c.a);

        Constructor c1 = new Constructor(10);
        System.out.println(c1.a);

    }

}
